package modules.cas.singleton2;

/**
 * 单例模式 - 懒汉式式
 *      存在问题， 单线程没有问题，多线程出现问题
 *      解决：保证只初始化对象一次
 *            双重检测锁 DCL懒汉式
 * @author shengren.yan
 * @create 2021-04-11
 */
public class Singleton3 {

    // 构造方法私有 ---
    private Singleton3(){
        System.out.println(Thread.currentThread().getName() + "执行");
    }

    private volatile static Singleton3 singleton3;

    // 如果对象存在就加载，平常不加载
    public static Singleton3 getInstance(){
        // 双重检测锁 DCL懒汉式
        if(null==singleton3){
            synchronized (Singleton3.class){
                if(null==singleton3){
                    singleton3 = new Singleton3();
                }
            }
        }
        return singleton3;
    }

    // 每次执行的结果不一样，理论上只私有化一次，每次执行的次数不一样
    public static void main(String[] args) {
        for (int i = 1; i <= 3000; i++) {
            new Thread(()->{
                Singleton3.getInstance();
            },"线程"+i).start();
        }
    }



}
